package com.cloudweb.oa.service;

import cn.js.fan.util.DateUtil;
import cn.js.fan.util.ErrMsgException;
import cn.js.fan.util.ParamUtil;
import cn.js.fan.util.StrUtil;
import com.cloudweb.oa.security.AuthUtil;
import com.cloudweb.oa.utils.SpringUtil;
import com.redmoon.oa.Config;
import com.redmoon.oa.pvg.OnlineUserDb;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

@Service
public class OnlineUserService {

    public void doLogoutPc(HttpServletRequest req) throws ErrMsgException {
        AuthUtil authUtil = SpringUtil.getBean(AuthUtil.class);
        OnlineUserDb ou = new OnlineUserDb();
        ou = ou.getOnlineUserDb(authUtil.getUserName());
        // 如果用户在线
        if (ou.isLoaded()) {
            // 超时时间为20分钟
            Config cfg = new Config();
            int expire = cfg.getInt("refreshOnlineExpire");
            long expiremilli = expire * 1000;
            long expiretime = System.currentTimeMillis() - expiremilli;
            Date d = new Date(expiretime);
            // 如果移动端已超时则置为离线
            if (DateUtil.compare(ou.getStayTimeMobile(), d) == 2) {
                ou.setOnline(false);
                ou.save();
            }
        }
    }

    public void doLogoutMobile(HttpServletRequest req) throws ErrMsgException {
        AuthUtil authUtil = SpringUtil.getBean(AuthUtil.class);
        OnlineUserDb ou = new OnlineUserDb();
        ou = ou.getOnlineUserDb(authUtil.getUserName());
        // 如果用户在线
        if (ou.isLoaded()) {
            // 超时时间为20分钟
            Config cfg = new Config();
            int expire = cfg.getInt("refreshOnlineExpire");
            long expiremilli = expire * 1000;
            long expiretime = System.currentTimeMillis() - expiremilli;
            Date d = new Date(expiretime);
            // 如果PC端已超时则置为离线
            if (DateUtil.compare(ou.getStayTime(), d) == 2) {
                ou.setOnline(false);
                ou.save();
            }
        }
    }

    public void refreshStayTime(HttpServletRequest req) throws ErrMsgException {
        if (ParamUtil.isMobile(req)) {
            refreshStayTimeMobile(req);
        } else {
            refreshStayTimePc(req);
        }
    }

    public void refreshStayTimePc(HttpServletRequest req) throws ErrMsgException {
        AuthUtil authUtil = SpringUtil.getBean(AuthUtil.class);
        OnlineUserDb ou = new OnlineUserDb();
        ou = ou.getOnlineUserDb(authUtil.getUserName());
        Date lastStayTime = ou.getStayTimeMobile();
        ou.setStayTime(new java.util.Date());
        ou.setOnline(true);
        // 如果用户在线
        if (ou.isLoaded()) {
            // 每隔5分钟保存一次
            if (DateUtil.datediffMinute(ou.getStayTimeMobile(), lastStayTime) >= 5) {
                ou.save();
            }
        } else {
            // 如果不在线，即超时被刷新掉了，则再加入在线列表
            ou.setName(authUtil.getUserName());
            ou.setLoginTime(new java.util.Date());
            ou.setIp(StrUtil.getIp(req));
            ou.setSessionId(req.getSession().getId());
            ou.create();
        }
    }

    public void refreshStayTimeMobile(HttpServletRequest req) throws ErrMsgException {
        AuthUtil authUtil = SpringUtil.getBean(AuthUtil.class);
        OnlineUserDb ou = new OnlineUserDb();
        ou = ou.getOnlineUserDb(authUtil.getUserName());

        Date lastStayTime = ou.getStayTimeMobile();
        ou.setStayTimeMobile(new java.util.Date());
        // 如果用户在线
        if (ou.isLoaded()) {
            // 每隔5分钟保存一次
            if (DateUtil.datediffMinute(ou.getStayTimeMobile(), lastStayTime) >= 5) {
                ou.save();
            }
        } else {
            // 如果不在线，即超时被刷新掉了，则再加入在线列表
            ou.setName(authUtil.getUserName());
            ou.setLoginTimeMobile(new java.util.Date());
            ou.setIpMobile(StrUtil.getIp(req));
            ou.create();
        }
    }

    public void setOffline(String userName) {
        OnlineUserDb ou = new OnlineUserDb();
        ou = ou.getOnlineUserDb(userName);
        if (ou.isLoaded()) {
            ou.setOnline(false);
            ou.save();
        }
    }
}
